package com.bilibili.juc.tl;


import java.util.Random;
import java.util.concurrent.TimeUnit;
class House1 //资源类
{
    int saleCount=0;
    public synchronized void saleHouse(){
        ++saleCount;
    }
    /*每个线程都有自己的ThreadLocal,存放自己线程的销售额,每个线程的销售额初始值都是0*/
    /*方式1：初始化值比较繁琐，不建议使用*/
//    ThreadLocal<Integer> saleVolume=new ThreadLocal<Integer>(){
//        protected Integer initiaValue(){
//            return 0;
//        }
//    };
    /*方式2：使用withInitial()方法初始化值,每个线程的销售额初始值都是0*/
    ThreadLocal<Integer> saleVolume=ThreadLocal.withInitial(()->0);
    /*销售额加一*/
    public void saleVolumeByThreadLocal(){
        saleVolume.set(1+saleVolume.get());
    }
}
/**
 * 需求1： 5个销售卖房子，集团高层只关心销售总量的准确统计数。
 */
public class ThreadLocalDemo1
{
    public static void main(String[] args)
    {
        House1 house = new House1();
        /*假设现在有5个销售在这里卖房子*/
        for (int i = 0; i < 5; i++) {
            try {
                new Thread(()->{
                    int size = new Random().nextInt(5)+1;
                    for (int j = 0; j < size; j++) {
                        house.saleHouse();/*记录卖出的房子总数*/
                        house.saleVolumeByThreadLocal();/*记录每个线程的销售数*/
                    }
                    System.out.println(Thread.currentThread().getName()+"卖出房子的数量是:"+house.saleVolume.get());
                },"销售"+String.valueOf(i)).start();
            } finally {
                /*清理线程里面的threadLocal变量*/
                house.saleVolume.remove();
            }
        }
        /*暂停毫秒，看看几毫秒之后卖出多少套房子*/
        try {TimeUnit.MILLISECONDS.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); }
        /*记录总数*/
        System.out.println(Thread.currentThread().getName()+"\t"+"共计卖出多少套： "+house.saleCount);
    }
}